/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sigodonto.view.managedbean;

import br.com.sigodonto.model.dao.DaoGenerico;
import br.com.sigodonto.model.entity.Clinica;
import br.com.sigodonto.model.entity.Dentista;
import br.com.sigodonto.model.entity.Medicamento;
import br.com.sigodonto.model.entity.MedicamentoPrescrevido;
import br.com.sigodonto.model.entity.Paciente;
import br.com.sigodonto.model.entity.Receituario;
import br.com.sigodonto.model.util.RelatorioUtil;
import br.com.sigodonto.view.datamodel.PacienteDataModel;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author Fidelis
 */
@ManagedBean
@ViewScoped
public class EmitirReceituarioMB implements Serializable {

    /**
     * Creates a new instance of EmitirReceituarioMB
     */
    private Paciente pacienteSelecionado;
    private Dentista dentista;
    private PacienteDataModel pacienteDataModel;
    private List<MedicamentoPrescrevido> listaPosologias;
    private List<Medicamento> medicamentosTodos;
    private DaoGenerico daoGenerico;
    private Receituario receituario;
    private Medicamento medicamentoCadastrar;
    private Medicamento medicamentoSelecionado;
    private String quantidade;
    private Clinica clinica;

    public EmitirReceituarioMB() {
        this.daoGenerico = new DaoGenerico();
        this.medicamentoCadastrar = new Medicamento();
        this.medicamentoSelecionado = new Medicamento();
        this.receituario = new Receituario();
        List<Paciente> pacientes = this.daoGenerico.listarTodos(Paciente.class);
        this.pacienteDataModel = new PacienteDataModel(pacientes);
        this.medicamentosTodos = this.daoGenerico.listarTodos(Medicamento.class);
        this.listaPosologias = new ArrayList<MedicamentoPrescrevido>();
        this.carregarDentista();
        this.carregarClinica();
    }

    public Paciente getPacienteSelecionado() {
        return pacienteSelecionado;
    }

    public void setPacienteSelecionado(Paciente pacienteSelecionado) {
        this.pacienteSelecionado = pacienteSelecionado;
    }

    public PacienteDataModel getPacienteDataModel() {
        return pacienteDataModel;
    }

    public void setPacienteDataModel(PacienteDataModel pacienteDataModel) {
        this.pacienteDataModel = pacienteDataModel;
    }

    public List<MedicamentoPrescrevido> getListaPosologias() {
        return listaPosologias;
    }

    public void setListaPosologias(List<MedicamentoPrescrevido> listaPosologias) {
        this.listaPosologias = listaPosologias;
    }

    public List<Medicamento> getMedicamentosTodos() {
        return medicamentosTodos;
    }

    public void setMedicamentosTodos(List<Medicamento> medicamentosTodas) {
        this.medicamentosTodos = medicamentosTodas;
    }

    public Receituario getReceituario() {
        return receituario;
    }

    public void setReceituario(Receituario receituario) {
        this.receituario = receituario;
    }

    public Medicamento getMedicamentoCadastrar() {
        return medicamentoCadastrar;
    }

    public void setMedicamentoCadastrar(Medicamento medicamentoCadastrar) {
        this.medicamentoCadastrar = medicamentoCadastrar;
    }

    public Medicamento getMedicamentoSelecionado() {
        return medicamentoSelecionado;
    }

    public void setMedicamentoSelecionado(Medicamento medicamentoSelecionado) {
        this.medicamentoSelecionado = medicamentoSelecionado;
    }

    public String getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(String quantidade) {
        this.quantidade = quantidade;
    }

    protected void redirect(String page) {

        FacesContext ctx = FacesContext.getCurrentInstance();
        ExternalContext ec = ctx.getExternalContext();

        try {
            ec.redirect(ec.getRequestContextPath() + page);
        } catch (IOException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), ex.getMessage()));
        }

    }

    public void cadastrarMedicamento() {
        FacesMessage message = new FacesMessage();
        String msg = "MEDICAMENTO CADASTRADO COM SUCESSO!";
        message.setSeverity(FacesMessage.SEVERITY_INFO);
        boolean certo;


        certo = this.daoGenerico.salvar(this.medicamentoCadastrar);

        if (!certo) {
            msg = "ERRO AO CADASTRAR MEDICAMENTO!";
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
        } else {
            this.medicamentosTodos = this.daoGenerico.listarTodos(Medicamento.class);
            this.medicamentoCadastrar = new Medicamento();
        }

        message.setSummary(msg);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public void excluirMedicamento() {
    }

    public void adcionarPosologiaCadastro() {
        System.out.println(this.medicamentoSelecionado.getNome());
        MedicamentoPrescrevido medicamentoPrescrevido = new MedicamentoPrescrevido();
        medicamentoPrescrevido.setMedicamento(this.medicamentoSelecionado);
        medicamentoPrescrevido.setQuantidade(quantidade);
        this.listaPosologias.add(medicamentoPrescrevido);
        this.quantidade = "";
    }

    public void emitirReceituario() {
        FacesMessage message = new FacesMessage();
        String msg = "RECEITUARIO CADASTRADO COM SUCESSO!";
        message.setSeverity(FacesMessage.SEVERITY_INFO);
        boolean certo;

        this.receituario.setPosologias(listaPosologias);
        this.receituario.setDentista(this.dentista);
        this.receituario.setPaciente(this.pacienteSelecionado);
        this.receituario.setData_realizacao(new Date());

        certo = this.daoGenerico.salvar(this.receituario);

        if (!certo) {
            msg = "ERRO AO CADASTRAR RECEITUARIO!";
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
        } else {
            HashMap<String, Object> parameterMap = new HashMap<String, Object>();
            String nomepaciente = this.pacienteSelecionado.getNome() +" "+ this.pacienteSelecionado.getSobrenome();
            String enderecoClinica = this.clinica.getEndereco().getLogradouro() + ", " + this.clinica.getEndereco().getNumero() + " - " + this.clinica.getEndereco().getBairro() + ", " + this.clinica.getEndereco().getCidade() + "-" + this.clinica.getEndereco().getUf();
            String logo = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/resources/clinica/"+ this.clinica.getLogo());
            parameterMap.put("NOME_PACIENTE", nomepaciente);
            parameterMap.put("RECEITA_OBSERVACAO", this.receituario.getObservacao());
            parameterMap.put("CLINICA_LOGO", logo);
            parameterMap.put("CLINICA_ENDERECO", enderecoClinica);
            parameterMap.put("CLINICA_EMAIL", this.clinica.getContato().getEmail());
            parameterMap.put("CLINICA_TELEFONE", this.clinica.getContato().getTelefone());
            parameterMap.put("CLINICA_CELULAR", this.clinica.getContato().getCelular());
            
            String relatorio = "receituario.jasper";
            RelatorioUtil.gerarRelatorio(relatorio, parameterMap, listaPosologias);
            this.receituario = new Receituario();
            this.listaPosologias = new ArrayList<MedicamentoPrescrevido>();
            this.pacienteSelecionado = new Paciente();
        }

        message.setSummary(msg);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public void onRowSelect(SelectEvent event) {
    }

    private void carregarDentista() {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        HttpSession session = (HttpSession) externalContext.getSession(true);
        this.dentista = (Dentista) session.getAttribute("usuario");
    }

    private void carregarClinica() {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        HttpSession session = (HttpSession) externalContext.getSession(true);
        Clinica clinica1 = (Clinica) session.getAttribute("clinica");
        if (clinica1 != null) {
            this.clinica = clinica1;
        } else {
            this.clinica = new Clinica();
        }
    }
}
